package com.lingyuan.warehouse.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;


import com.lingyuan.common.core.domain.vo.call.WareCall;
import com.lingyuan.warehouse.domain.WareSkuVO;
import com.lingyuan.warehouse.mapper.SkuWareMapper;
import com.lingyuan.warehouse.service.SkuWareService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @ClassName SkuWareServiceImpl
 * @Description 描述
 * @Author guoxin
 * @Date 2024/9/24 19:27
 */
@Service
public class SkuWareServiceImpl extends ServiceImpl<SkuWareMapper, WareSkuVO> implements SkuWareService {
    /**
     * 添加商品库存
     * @param wareSkuVO
     */
    @Override
    public void addSkuWare(WareSkuVO wareSkuVO) {
        this.save(wareSkuVO);
    }

    /**
     * 锁定库存
     * @param wareCallList
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void lockStock(List<WareCall> wareCallList) {
        //用mybatis-plus乐观锁锁定库存
        // 查询当前库存
        wareCallList.stream().forEach(wareCall -> {
            WareSkuVO ware = this.getOne(new QueryWrapper<WareSkuVO>().lambda().eq(WareSkuVO::getSkuId ,wareCall.getId()));
            if (ware == null) {
                throw new RuntimeException("仓库不存在");
            }
            // 检查库存是否足够
            if (ware.getStockLocked() + wareCall.getStock() > ware.getStock()) {
                throw new RuntimeException("库存不足");
            }

            // 更新库存
            WareSkuVO wareSkuVO = new WareSkuVO();
            wareSkuVO.setId(ware.getId());
            wareSkuVO.setVersion(ware.getVersion() + 1);
            wareSkuVO.setStockLocked((int) (ware.getStockLocked()+wareCall.getStock()));

            UpdateWrapper<WareSkuVO> updateWrapper = new UpdateWrapper<>();
            updateWrapper.eq("id", wareSkuVO.getId());
            updateWrapper.eq("version", ware.getVersion());

            boolean result = this.update(wareSkuVO, updateWrapper);
            if (!result) {
                throw new RuntimeException("锁定库存失败");
            }
        });

    }
    /**
     * 释放库存
     * @param wareCallList
     */
    @Override
    public void releaseStock(List<WareCall> wareCallList) {
        //用mybatis-plus乐观锁锁定库存
        // 查询当前库存
        wareCallList.stream().forEach(wareCall -> {
            WareSkuVO ware = this.getOne(new QueryWrapper<WareSkuVO>().lambda().eq(WareSkuVO::getSkuId, wareCall.getId()));
            if (ware == null) {
                throw new RuntimeException("仓库不存在");
            }
            // 检查库存是否足够
            if (ware.getStockLocked() + wareCall.getStock() > ware.getStock()) {
                throw new RuntimeException("库存不足");
            }

            // 更新库存
            UpdateWrapper<WareSkuVO> updateWrapper = new UpdateWrapper<>();
            updateWrapper.eq("id", ware.getWareId());
            updateWrapper.eq("version", ware.getVersion());

            ware.setStockLocked((int) (ware.getStockLocked() - wareCall.getStock()));
            ware.setVersion(ware.getVersion() + 1);

            boolean result = this.update(ware, updateWrapper);
            if (!result) {
                throw new RuntimeException("锁定库存失败");
            }
        });
    }

}
